//加载db模块
const db = require('../db');

const moment = require('moment');//加载moment模块

// 存放 文章 相关的路由
const express = require('express');
const router = express.Router();

//-----------------------使用验证规则----------------------------
const validator = require('express-joi-validation').createValidator({
    passError: true// true 表示把错误 next(err)
});

//加载验证规则
const articleSchema = require('../schema/article');

//-----------------------------获取文章的列表接口----------------------------
router.get('/list', validator.query(articleSchema), async (req, res) => {
    //获取请求参数 pagenum和pagesize是必填的
    let { pagenum, pagesize, state, cate_id } = req.query;//解构赋值获取四个请求参数

    //判断一下，客户端是否使用了state和cate_id参数，如果使用了，在SQL中加入查询条件即可
    let w = '';
    if (state) {
        w += ` and state='${state}' `;//注意要加'' 因为是字符串
    }
    if (cate_id) {
        w += ` and cate_id=${cate_id} `;
    }
    //实现分页数据查询
    let sql = `select a.Id,title,state,pub_date,name cate_name from article a 
                join category c on a.cate_id=c.Id
                where is_delete=0 and author_id=? ${w}
                limit ${(pagenum - 1) * pagesize},${pagesize}`;

    let r = await db(sql, req.user.id);//这里根据上面的SQL,查询了数据

    //下面查询总记录数（查询总数的条件必须和查询数据的条件一致）
    let sql2 = `select count(*) total from article a 
                join category c on a.cate_id=c.Id
                where is_delete=0 and author_id=? ${w}`;
    let r2 = await db(sql2, req.user.id);
    // console.log(r2);//[{ total: 11 } ]
    if (r) {
        res.send({
            status: 0,
            message: '获取文章列表成功',
            data: r,
            total: r2[0].total
        });
    } else {
        res.send({ status: 1, message: '获取文章列表失败' });
    }
});


//-------------------------根据Id删除一篇文章接口-----------------------
router.get('/delete/:id', async (req, res) => {
    //获取url动态参数 id  用req.params
    let id = req.params.id;
    //删除文章不应该真的删除 使用delete语句
    //这里假删除，使用update语句，将is_delete字段修改为1
    let r = await db('update article set is_delete=1 where Id=?', id);
    if (r && r.changedRows > 0) {//这里换个判断条件 把affectedRows 换成 changedRows
        res.send({ status: 0, message: '删除文章成功' });
    } else {
        res.send({ status: 1, message: '删除文章失败' });
    }
});

//-------------------------根据Id获取一篇文章接口-----------------------
router.get('/:id', async (req, res) => {
    let id = req.params.id;
    //根据id去查询一篇文章
    let r = await db('select * from article where Id=?', id);
    if (r && r.length > 0) {
        res.send({ status: 0, message: '获取一篇文章详情成功', data: r[0] });
    } else {
        res.send({ status: 1, message: '获取一篇文章详情失败' });
    }
});

//-------------------------添加文章接口-----------------------
//加载multer模块，用于处理form-data类型的数据
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });
router.post('/add', upload.single('cover_img'), async (req, res) => {
    //req.file   获取到上传文件的信息
    //req.body    获取到提交的的文本信息
    // console.log(req.file);
    // console.log(req.body);
    //编写SQL，添加到数据库即可
    let obj = req.body;//赋值之后，obj对象里面有title  content  cate_id  state
    //向obj对象中继续添加必填字段  is_delete可以不用管，设计表的时候设置了默认值0
    obj.cover_img = req.file.filename;//添加图片的名字
    obj.pub_date = moment().format('YYYY-MM-DD HH:mm:ss');//添加发布时间
    obj.author_id = req.user.id;//添加用户id
    let r = await db('insert into article set ?', obj);
    if (r && r.affectedRows > 0) {
        res.send({ status: 0, message: '添加文章成功' });
    } else {
        res.send({ status: 1, message: '添加文章失败' });
    }
});

//-------------------------根据文章Id修改文章接口-----------------------
router.post('/edit', upload.single('cover_img'), async (req, res) => {
    let obj = req.body;//赋值之后，obj对象里面有title  content  cate_id  state
    //向obj对象中继续添加必填字段  is_delete可以不用管，设计表的时候设置了默认值0
    obj.cover_img = req.file.filename;//添加图片的名字

    let r = await db('update article set ? where Id=?', [obj, req.body.Id]);
    if (r && r.affectedRows > 0) {
        res.send({ status: 0, message: '更新文章成功' });
    } else {
        res.send({ status: 1, message: '更新文章失败' });
    }
});

module.exports = router;